import { message, notification } from 'antd';
import {decode} from 'jsonwebtoken';
import {history} from '@umijs/max';
enum ErrorShowType {
    SILENT = 0,//表示此错误不需要通知用户
    WARN_MESSAGE = 1,//表示发出警告
    ERROR_MESSAGE = 2,//表示发出错误警告
    NOTIFICATION = 3//普通的通知
}
//定义接口响应的格式
interface ResponseStructure {
    success: boolean;//表示后台业务成功了还是失败了
    data: any;//真正返回的数据
    errorCode?: number;///错误编码 
    errorMessage?: string;//错误描述
    showType?: ErrorShowType;//如何显示或者说通知错误
}

const errorThrower = (res: ResponseStructure) => {
    //如果能走到这里，说是HTTP请求正常发出了，响应也正常回来了，状态也是正常
    const { success, errorCode, errorMessage, showType } = res;
    //说明业务处理失败了
    if (!success) {
        //errorMessage 用户名密码错误
        const error: any = new Error(errorMessage);
        error.name = 'BizError';//业务异常
        //此错误携带的具体的信息
        error.info = { errorCode, errorMessage, showType }
        //抛出的异常会被errorHandler捕获处理
        throw error;
    }
}
const errorHandler = (error: any) => {
    if (error.name === 'BizError') {
        const { info: { errorCode, errorMessage, showType } } = error;
        switch (showType) {
            case ErrorShowType.SILENT://不需要任何通知
                break;
            case ErrorShowType.WARN_MESSAGE:
                message.warn(errorMessage);  //如果要显示警告，可以使用antd的消息组件提供警告信息
                break;
            case ErrorShowType.ERROR_MESSAGE:
                message.error(errorMessage);  //如果要显示错误，可以使用antd的消息组件提供错误信息
                break;
            case ErrorShowType.NOTIFICATION:
                notification.open({
                    description: errorMessage,
                    message: errorCode
                });
                break;
            default:
                message.error(errorMessage);
                break;
        }
    } else if (error.response) {
        message.error('响应状态${error.response.status}');
    } else if (error.request) {
        message.error('没有收到响应');
    } else {
        message.error('请求发送失败');
    }
}
//请求的运行时配置，关于请求的配置
export const request = {
    timeout: 3000,//超时间，如果在规定时间内还没有返回响应，直接请求失败
    headers: {//配置请求头
        ['Content-Type']: 'application/json',//指定请求体的格式
        'Accept': 'application/json',//提定可以接受的响应的格式
        'credentials': 'include'//在跨域的时候携带cookie
    },
    //请求拦截器
    requestInterceptors: [
        (config) => {
            return config;
        }
    ],
    //响应拦截器
    responseInterceptors: [
        (response) => {
            // 拦截响应数据，进行个性化处理
            const { data } = response;
            if (!data.success) {
                message.error('请求失败！');
            }
            return response;
        }
    ],
    errorConfig: {
        errorThrower,//把一个不是错误的响应变成一个错误抛出,代表业务异常
        errorHandler//错误处理
    }
}
//布局的运行时配置
export const layout = ({initialState}) => {
    return {
        title: 'UMIMax',//设置标题
        logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',
        // 其他属性见：https://procomponents.ant.design/components/layout#prolayout
        //当页面切换或者说路由工换的时候会执行此函数
        onPageChange({pathname}){
            if(!(initialState?.currentUser) 
            && (pathname!=='/signin' || pathname!=='/signup')){
                //则不让访问了，直接跳到登录页直接登录
                history.push('/signin');
            }
        }
    };
};

/**
 * 全局初始状态在整个 Umi 项目的最开始创建
 * 导出方法 getInitialState()，其返回值将成为全局初始状态。例如：
 */
export async  function getInitialState(){
    //定义初始状态
    let InitialState = {currentUser:null};
    //获取本地存储中的token
    const token = localStorage.getItem('token');
    //如果token是存在的话
    if(token){
        //使用jsonwebtoken解开token，得到用户信息
        let currentUser = decode(token);
        if(currentUser){
            InitialState.currentUser=currentUser;
        }
    }
    return InitialState;
}
